﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDB; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
using System.Data;
using System.Data.SqlClient;

namespace ForrajeriaDAL
{
    public class DetallePedidoProveedorDAL : AccesoDAL, InterfazDAL<DetallePedidoMO>
    {
        #region VARIABLES PARA STORED QUE MANEJA EL OBJETO DE DAL

        private static string insert = "DetallePedidoProveedor_INSERT";
        private static string delete = "DetallePedidoProveedor_DELETE";
        private static string update = "DetallePedidoProveedor_UPDATE";
        private static string all = "DetallePedidoProveedor_GetALL";
        private static string getXID = "DetallePedidoProveedor_GetByID";
        private static string allRegistrar = "DetallePedidoProveedor_GetALLRegistrar";

        #endregion

        private SqlCommand cmd; //var de comando sql

        #region "Singleton"

        private static DetallePedidoProveedorDAL instance;
        private DetallePedidoProveedorDAL() : base()
        {
        }

        public static DetallePedidoProveedorDAL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new DetallePedidoProveedorDAL();
                }
                return instance;
            }
        }

        #endregion

        #region Interfaz

        public List<DetallePedidoMO> GetAll()
        {
            SqlDataReader reader = null;
            List<DetallePedidoMO> lista = new List<DetallePedidoMO>();
            try
            {
                cmd = new SqlCommand(all, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                opencon();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    DetallePedidoMO aux = new DetallePedidoMO();
                    //****************************Formar objeto aux**********************
                    aux.NroPedido = int.Parse(reader["nroPedido"].ToString());
                    aux.NroLinea = int.Parse(reader["nroLinea"].ToString());
                    aux.Forraje = int.Parse(reader["forraje"].ToString());
                    aux.Cantidad = double.Parse(reader["cantidad"].ToString());

                    if (reader["descripcion"].ToString() != null)
                    { aux.Descripcion = reader["descripcion"].ToString(); }
                    else { aux.Descripcion = ""; }

                    aux.Precio = double.Parse(reader["precio"].ToString());
                    //************************Fin Formar objeto aux*********************
                    lista.Add(aux);
                    aux = null;
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw ex; //en caso que no pueda leer desde la base de datos tira el hacia la siguiente capa 
            }
            finally //finalmente cierro el reader que use para traer la consulta esto es importante ya que por alguna razon podria quedar abierto generando una conexion sin uso en la bd que estaria todo el tiempo abierta
            {
                closeReader(reader); //cierro el reader
                closecon();// cierra conexion
            }
        }

        public void Adicionar(DetallePedidoMO item)
        {
            try
            {
                cmd = new SqlCommand(insert, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@nroPedido", SqlDbType.Int).Value = item.NroPedido;
                cmd.Parameters.Add("@nroLinea", SqlDbType.Int).Value = item.NroLinea;
                cmd.Parameters.Add("@forraje", SqlDbType.Int).Value = item.Forraje;
                cmd.Parameters.Add("@cantidad", SqlDbType.Float).Value = item.Cantidad;
                //cmd.Parameters.Add("@precio", SqlDbType.Float).Value = item.Precio;

                opencon();
                cmd.ExecuteNonQuery();
                closecon();

            }
            catch (Exception ex)
            {
                closecon();
                throw ex;
            }
        }

        public void Eliminar(DetallePedidoMO item)
        {
            throw new NotImplementedException();
        }

        public void Actualizar(DetallePedidoMO nuevoItem, DetallePedidoMO origItem)
        {
            throw new NotImplementedException();
        }

        public List<DetallePedidoMO> getByNroPedido(int nroPedido)
        {
            SqlCommand cmd = new SqlCommand(getXID, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@nroPedido", SqlDbType.Int).Value = nroPedido;

            SqlDataReader rea;

            try
            {
                opencon();
                rea = cmd.ExecuteReader();
                List<DetallePedidoMO> reto = new List<DetallePedidoMO>();
                while (rea.Read())
                {
                    DetallePedidoMO aux = new DetallePedidoMO();

                    aux.NroPedido = (int)rea["nroPedido"];
                    aux.NroLinea = (int)rea["nroDetalle"];
                    aux.Forraje = (int)rea["forraje"];
                    aux.Cantidad = (double)rea["cantidad"];
                    aux.Precio = (double)rea["precio"];

                    reto.Add(aux);
                }
                rea.Close();
                return reto;
            }

            catch (SqlException ex)
            {
                throw new Exception("Error SQL: " + ex.Message);
            }

            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                closecon();
            }
        }

        #endregion

    }
}
